import pandas as pd
import altair as alt
import geopandas as gpd
alt.data_transformers.disable_max_rows()
DataTransformerRegistry.enable('default')
pop_trends = pd.read_csv('population_trends.csv')
pop_trends.head()
| region | year | rate | |
|---|---|---|---|
| 0 | Ukraine | 1989 | 1.7 |
| 1 | Ukraine | 1990 | 0.5 |
| 2 | Ukraine | 1991 | -0.8 |
| 3 | Ukraine | 1992 | -2.0 |
| 4 | Ukraine | 1993 | -3.5 |
ukraine = gpd.read_file('ukraine.json')
ukraine.head()
| GID_0 | NAME_0 | GID_1 | NAME_1 | VARNAME_1 | NL_NAME_1 | TYPE_1 | ENGTYPE_1 | CC_1 | HASC_1 | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | UKR | Ukraine | UKR.1_1 | Cherkasy | Cherkas'ka Oblast'|Cherkasskaya Oblast'|Cherkassy | None | Oblast' | Region | None | UA.CK | MULTIPOLYGON (((31.32614 48.74507, 31.31716 48... |
| 1 | UKR | Ukraine | UKR.2_1 | Chernihiv | Chernigov|Tschernigow | None | Oblast' | Region | None | UA.CH | MULTIPOLYGON (((33.09283 50.50966, 33.09261 50... |
| 2 | UKR | Ukraine | UKR.3_1 | Chernivtsi | Chernivets'ka Oblast'|Chernovitskaya Oblast'|C... | None | Oblast' | Region | None | UA.CV | MULTIPOLYGON (((24.93280 47.72794, 24.93301 47... |
| 3 | UKR | Ukraine | UKR.4_1 | Crimea | Crimée|Criméia|Krim|Krymskaya Respublika|Respu... | None | Autonomous Republic | Autonomous Republic | None | UA.KR | MULTIPOLYGON (((33.79291 44.39153, 33.79465 44... |
| 4 | UKR | Ukraine | UKR.5_1 | Dnipropetrovs'k | Dnipropetrovsk|Dniepropietrovsk|Dnjepropetrowsk | None | Oblast' | Region | None | UA.DP | MULTIPOLYGON (((33.93176 47.48407, 33.92332 47... |
pop_trends = pop_trends[pop_trends['region'] != 'Ukraine']
pop_trends_last_year = {'region':[], 'year':[], 'rate':[]}
regions = list(set(pop_trends['region']))
for region in regions:
temp = pop_trends[pop_trends['region']==region]
temp = temp[temp['year'] == max(list(set(temp['year'])))]
pop_trends_last_year['region'].append(list(temp['region'])[0])
pop_trends_last_year['year'].append(list(temp['year'])[0])
pop_trends_last_year['rate'].append(list(temp['rate'])[0])
pop_trends_last_year = pd.DataFrame.from_dict(pop_trends_last_year)
pop_trends_last_year.head()
| region | year | rate | |
|---|---|---|---|
| 0 | Volyn | 2019 | -2.8 |
| 1 | Odesa | 2019 | -5.1 |
| 2 | Ternopil' | 2019 | -6.6 |
| 3 | Transcarpathia | 2019 | -2.0 |
| 4 | Vinnytsya | 2019 | -7.9 |
base = alt.Chart(ukraine).mark_geoshape(fill = 'lightgray', stroke = 'white', strokeWidth = 1
).project().properties(
title = 'Рівень приросту / скорочення населення України за 2019 рік'
)
select_region = alt.selection_single(on = 'mouseover',
fields = ['NAME_1'],
nearest = False, empty = 'all')
coloring = alt.Chart(ukraine).transform_lookup(
lookup = 'NAME_1',
from_ = alt.LookupData(data = pop_trends_last_year,
key = 'region',
fields=['region','year', 'rate'])
).transform_calculate(
Rate='isValid(datum.rate) ? datum.rate : "Undefined"'
).project().mark_geoshape(stroke = 'lightgrey').encode(
color = alt.Color('rate:Q', scale=alt.Scale(scheme='greens', reverse=True),
legend=alt.Legend(orient = 'bottom-left')),
opacity=alt.condition(
select_region,
alt.value(0.8),
alt.value(0.3)
),
tooltip = [
alt.Tooltip('region:N'),
alt.Tooltip('Rate:Q')
]
).add_selection(select_region)
layered = alt.layer(base, coloring).encode(tooltip = [
alt.Tooltip('NAME_1:N', title='region')
])
line_chart = alt.Chart(pop_trends).transform_lookup(
lookup = 'region',
from_ = alt.LookupData(data = ukraine,
key = 'NAME_1',
fields=list(ukraine.columns))
).mark_line().encode(
x=alt.X('year:O'),
y=alt.Y('rate:Q', title='Rate', scale = alt.Scale(domain = [-16, 8])),
color=alt.condition(
select_region,
alt.Color('region:N', title='Region'),
alt.ColorValue('lightgrey')
),
tooltip=[alt.Tooltip('region:N'),
alt.Tooltip('rate:Q')],
strokeWidth=alt.condition(
select_region,
alt.value(2),
alt.value(0.5)
)
).add_selection(select_region).properties(
title='Рівень приросту / скорочення населення за регіонами за всіма роками'
)
alt.hconcat(layered.properties(width = 550, height = 500),
line_chart.properties(width = 650, height = 500)
).properties(
background = '#F9F9F9', padding = 25).configure_view(
strokeWidth=0)